package icontrolv2

import org.springframework.dao.DataIntegrityViolationException
import grails.converters.deep.JSON

class UsuarioController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index() {
        redirect(action: "list", params: params)
    }

    def list() {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [usuarioInstanceList: Usuario.list(params), usuarioInstanceTotal: Usuario.count()]
    }

    def create() {
        [usuarioInstance: new Usuario(params)]
    }

    def save() {
        def usuarioInstance = new Usuario(params)
        if (!usuarioInstance.save(flush: true)) {
            render(view: "create", model: [usuarioInstance: usuarioInstance])
            return
        }

		flash.message = message(code: 'default.created.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])
        redirect(action: "show", id: usuarioInstance.id)
    }

    def show() {
        def usuarioInstance             = Usuario.get(params.id)
        def calificacionNegativa        = TipoCalificacion.get(1)
        def calificacionNeutra          = TipoCalificacion.get(2)
        def calificacionPositiva        = TipoCalificacion.get(1)
        
        def negativa                    = 0
        def neutra                      = 0
        def positiva                    = 0
        
        def calificaciones              = Calificacion.findAll()
        
        for(int i = 0;i < calificaciones.size();i ++) {
            if(calificaciones[i].tarea.usuario.getId() == usuarioInstance.id) {
                if(calificaciones[i].tipoCalificacion.id == 1) {
                    negativa ++
                }
                
                if(calificaciones[i].tipoCalificacion.id == 2) {
                    neutra ++
                }
                
                if(calificaciones[i].tipoCalificacion.id == 3) {
                    positiva ++
                }
            }
        }
        
        def stringGraficoCalificaciones = stringXmlGraficoCalificaciones(negativa, neutra, positiva)
        
        if (!usuarioInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
            redirect(action: "list")
            return
        }

        [
            usuarioInstance: usuarioInstance
            ,negativa:negativa
            ,neutra:neutra
            ,positiva:positiva
            ,stringGraficoCalificaciones:stringGraficoCalificaciones
        ]
    }

    def edit() {
        def usuarioInstance = Usuario.get(params.id)
        if (!usuarioInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
            redirect(action: "list")
            return
        }

        [usuarioInstance: usuarioInstance]
    }

    def update() {
        def usuarioInstance = Usuario.get(params.id)
        if (!usuarioInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
            redirect(action: "list")
            return
        }

        if (params.version) {
            def version = params.version.toLong()
            if (usuarioInstance.version > version) {
                usuarioInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                          [message(code: 'usuario.label', default: 'Usuario')] as Object[],
                          "Another user has updated this Usuario while you were editing")
                render(view: "edit", model: [usuarioInstance: usuarioInstance])
                return
            }
        }

        usuarioInstance.properties = params

        if (!usuarioInstance.save(flush: true)) {
            render(view: "edit", model: [usuarioInstance: usuarioInstance])
            return
        }

		flash.message = message(code: 'default.updated.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])
        redirect(action: "show", id: usuarioInstance.id)
    }

    def delete() {
        def usuarioInstance = Usuario.get(params.id)
        if (!usuarioInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
            redirect(action: "list")
            return
        }

        try {
            usuarioInstance.delete(flush: true)
			flash.message = message(code: 'default.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
            redirect(action: "list")
        }
        catch (DataIntegrityViolationException e) {
			flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
            redirect(action: "show", id: params.id)
        }
    }
    
    def login(){
        
    }
    
    def logout(){
        session.invalidate()
        
        redirect(action: "login")
    }
    
    def validarUsuario(){
        def usuario             = Usuario.findWhere(nombreUsuario: params.nombreUsuario, password: params.password);
        
        if(usuario){
            session['usuario']  = usuario
            
            redirect(controller: 'home')
        }else{
            flash.message = 'Nombre de Usuario y/o Password incorrectos'
            
            redirect(action: 'login')
        }        
    }
    
    def agregarConocimiento(){
        Rubro.list()
        
        [idUsuario:params.id]
    }
    
    def grabarConocimientoUsuario(){
        def usuarioConocimiento             = new UsuarioConocimiento()
        def usuario                         = Usuario.get(params.usuario_id)
        def tipoConocimiento                = TipoConocimiento.get(params.tipoConocimiento)
        def conocimiento                    = Conocimiento.get(params.conocimiento)
        def rubro                           = Rubro.get(params.rubro)
        
        usuarioConocimiento.tipoConocimiento            = tipoConocimiento
        usuarioConocimiento.conocimiento                = conocimiento
        usuarioConocimiento.usuario                     = usuario
        usuarioConocimiento.rubro                       = rubro
        
        if(usuarioConocimiento.save(flush:true)){
            flash.mensajeExito = "Conocimiento grabado exitosamente"
        }else{
            flash.mensajeError = "Ha ocurrido un error al grabar, favor intente nuevamente"
        }
        
        redirect(action:'show', id:params.usuario_id)
    }
    
    def listaConocimientosAjax(){
        def conocimientos = Conocimiento.withCriteria {
            like('nombre', '%' + params.q + '%')
        }
        
        def conocimiento = new ArrayList()
        
        for(int i = 0;i < conocimientos.size();i ++){
            conocimiento[i] = conocimientos[i].getNombre()
        }
        
        render conocimiento as JSON
    }
    
    def agregarPermiso(){
        
    }
    
    def stringXmlGraficoCalificaciones(int negativa, int neutra, int positiva) {
        String strXML;
	    //Initialize <chart> element
	    strXML = "<chart caption='Calificaciones del Usuario' yAxisName='Cantidad Calificaciones' formatNumberScale='0' yAxisMinValue='0' forceDecimals='0'>";
	    //Convert data to XML and append
            strXML = strXML + "<set label='Negativas' value='" + negativa + "' color='ff0000' />";
            strXML = strXML + "<set label='Neutras' value='" + neutra + "' color='ffff00' />";
            strXML = strXML + "<set label='Positivas' value='" + positiva + "' color='00ff00' />";
	    //Close <chart> element
    	strXML = strXML + "</chart>";
        
        return strXML
    }
}
